﻿#----------------------------------------------------------------------------
# Purpose: To demonstrate programming in natural language.
# Version: Thinknowlogy 2018r4 (New Science)
#----------------------------------------------------------------------------
# Copyright (C) 2009-2018, Menno Mafait. Your suggestions, modifications,
# corrections and bug reports are welcome at http://mafait.org/contact/
#----------------------------------------------------------------------------

#----------------------------------------------------------------------------
# Un resumen del rompecabezas de la "Torres de Hanói":
#----------------------------------------------------------------------------
# El juego, en su forma más tradicional, consiste en tres varillas
# verticales. En una de las varillas se apila un número indeterminado de
# discos (elaborados de madera) que determinará la complejidad de la
# solución, por regla general se consideran ocho discos. Los discos se
# apilan sobre una varilla en tamaño decreciente. No hay dos discos
# iguales, y todos ellos están apilados de mayor a menor radio en una de
# las varillas, quedando las otras dos varillas vacantes. El juego
# consiste en pasar todos los discos de la varilla ocupada (es decir la
# que posee la torre) a una de las otras varillas vacantes. Para realizar
# este objetivo, es necesario seguir tres simples reglas:
# 1 - Sólo se puede mover un disco cada vez.
# 2 - Un disco de mayor tamaño no puede descansar sobre uno más pequeño
#     que él mismo.
# 3 - Sólo puedes desplazar el disco que se encuentre arriba en cada
#     varilla.
# Existen diversas formas de realizar la solución final, todas ellas
# siguiendo estrategias diversas.
#----------------------------------------------------------------------------
# Vea el texto completo: https://es.wikipedia.org/wiki/Torres_de_Han%C3%B3i
#----------------------------------------------------------------------------

# Definir los movimientos.
Cada movimiento es entre-inicio-y-intercambio, entre-inicio-y-objetivo, entre-intercambio-y-objetivo, hecho-entre-inicio-y-intercambio, hecho-entre-inicio-y-objetivo o hecho-entre-intercambio-y-objetivo.

# Mostrar los movimientos.
Si el movimiento es hecho-entre-inicio-y-intercambio o el movimiento es hecho-entre-inicio-y-objetivo o el movimiento es hecho-entre-intercambio-y-objetivo entonces mostrar "* polo de inicio:\t~+'polo de inicio'<a>`~.\n* polo de intercambio:\t~+'polo de intercambio'<a>`~.\n* polo de objetivo:\t~+'polo de objetivo'<a>`~.\n\n".

# Las reglas para mover los discos.
Si el movimiento es entre-intercambio-y-objetivo entonces si el polo de intercambio es asignado y el polo de objetivo no es asignado o el polo de intercambio es asignado y la cabeza de el polo de intercambio es menor que la cabeza de el polo de objetivo entonces mueva la cabeza de el polo de intercambio para el polo de objetivo, el movimiento es hecho-entre-intercambio-y-objetivo y mostrar "Movido un disco desde el polo intercambio para el polo de objetivo:\n" sino mueva la cabeza de el polo de objetivo para el polo de intercambio, el movimiento es hecho-entre-intercambio-y-objetivo y mostrar "Movido un disco desde el polo objetivo para el polo de intercambio:\n".
Si el movimiento es entre-inicio-y-objetivo entonces si el polo de inicio es asignado y el polo de objetivo no es asignado o el polo de inicio es asignado y la cabeza de el polo de inicio es menor que la cabeza de el polo de objetivo entonces mueva la cabeza de el polo de inicio para el polo de objetivo, el movimiento es hecho-entre-inicio-y-objetivo y mostrar "Movido un disco desde el polo inicio para el polo de objetivo:\n" sino mueva la cabeza de el polo de objetivo para el polo de inicio, el movimiento es hecho-entre-inicio-y-objetivo y mostrar "Movido un disco desde el polo objetivo para el polo de inicio:\n".
Si el movimiento es entre-inicio-y-intercambio entonces si el polo de inicio es asignado y el polo de intercambio no es asignado o el polo de inicio es asignado y la cabeza de el polo de inicio es menor que la cabeza de el polo de intercambio entonces mueva la cabeza de el polo de inicio para el polo de intercambio, el movimiento es hecho-entre-inicio-y-intercambio y mostrar "Movido un disco desde el polo inicio para el polo de intercambio:\n" sino mueva la cabeza de el polo de intercambio para el polo de inicio, el movimiento es hecho-entre-inicio-y-intercambio y mostrar "Movido un disco desde el polo intercambio para el polo de inicio:\n".

# Antes de cada nuevo movimiento, el orden se establece en la que se deben ejecutar las normas.
Si el orden de ejecución es impar-primero entonces si el movimiento no es asignado o el movimiento es hecho-entre-intercambio-y-objetivo entonces el movimiento es entre-inicio-y-objetivo sino si el movimiento es hecho-entre-inicio-y-objetivo entonces el movimiento es entre-inicio-y-intercambio sino el movimiento es entre-intercambio-y-objetivo.
Si el orden de ejecución es par-primero entonces si el movimiento no es asignado o el movimiento es hecho-entre-intercambio-y-objetivo entonces el movimiento es entre-inicio-y-intercambio sino si el movimiento es hecho-entre-inicio-y-intercambio entonces el movimiento es entre-inicio-y-objetivo sino el movimiento es entre-intercambio-y-objetivo.

# Al principio, determinar el orden en que deben ejecutarse las normas.
Si el polo de inicio es asignado, el polo de intercambio no es asignado y el polo de objetivo no es asignado entonces si el número de el polo de inicio es impar entonces el orden de ejecución es impar-primero y mostrar "\nEl número de discos es impar. Por lo tanto, el orden de las reglas es: Mover primero desde el pole de inicio para el polo objetivo, entonces desde el pole de inicio para el polo de intercambio.\n\n" sino el orden de ejecución es par-primero y mostrar "\nEl número de discos es par. Por lo tanto, el orden de las reglas es: Mover primero desde el pole de inicio para el polo intercambio, entonces desde el pole de inicio para el polo de objetivo.\n\n".

# Definir el final.
Si el movimiento es asignado, el polo de inicio no es asignado, el polo de intercambio no es asignado y el polo de objetivo es asignado entonces el movimiento es vacío, el orden de ejecución es vacío y mostrar "Hecho.\nPara iniciar el rompecabezas de nuevo, haga clic en el botón «Despejar la mente.» y entonces «Leer el archivo \"Español/programación/Torres de Hanói\".».".

# Ahora agregue un número par o impar de discos en orden inverso,
# el más grande primero (por ejemplo: D o E), y el más pequeño (A) en la parte superior, como:
# - Para un número par de discos:	Añadir D, C, B y A para el polo de inicio.
# - Para un número impar de discos:	Añadir E, D, C, B y A para el polo de inicio.